package com.me.study.javaCore.classLoader;

import com.me.study.javaCore.classLoader.customClassLoader.ObjA;
import com.me.study.javaCore.classLoader.customClassLoader.MyClassLoader;
import org.junit.Assert;

/**
 * 上下文类加载器 ContextClassLoader：
 *      和线程相关的 类加载器，Thread.currentThread().getContextClassLoader()
 *
 * @author ME
 * @date 2021/7/7
 */
public class TestContextClassLoader {

    private static String className = "com.me.study.javaCore.classLoader.customClassLoader.ObjA";

    public static void main(String[] args) throws Exception {
        MyClassLoader loader1 = new MyClassLoader();
        Class<ObjA> clazz1 = loadClass(loader1, className);
        System.out.println(clazz1.getClassLoader());
        System.out.println(ObjA.class.getClassLoader());
        // 还是不能强转，为啥咧，自定义加载器加载的对象和自己不是同一个哦。。
        Object obj1 = clazz1.newInstance();

        MyClassLoader loader2 = new MyClassLoader();
        Class<ObjA> clazz2 = loadClass(loader2, className);

        System.out.println("Class对象是 不相同的两个对象：" + (clazz1 != clazz2));
    }

    /**
     * 设置指定的 类加载器 为 ContextClassLoader，并加载类信息
     * @param classLoader   类加载器
     * @param className     类的全限定类名
     * @param <T>   指定类型
     * @return  指定类型的类信息
     * @throws ClassNotFoundException   ClassNotFoundException
     */
    @SuppressWarnings("unchecked")
    private static <T> Class<T> loadClass(ClassLoader classLoader, String className) throws ClassNotFoundException {
        Thread.currentThread().setContextClassLoader(classLoader);
        Class<T> clazz = (Class<T>) Class.forName(className, false, classLoader);

        ClassLoader thisLoader = clazz.getClassLoader();
        System.out.println("加载当前类的 classLoader 为：" + thisLoader);
        System.out.println("传入的 classLoader 为：" + classLoader + "\n");
        Assert.assertEquals("两个 classLoader 是相同的！", classLoader, thisLoader);

        return clazz;
    }

}
